home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 October: Mac OS SDK / Dev.CD Oct 96 SDK / Dev.CD Oct 96 SDK2.toast / Development Kits (Disc 2) / OpenDoc Development Framework / ODFDev / ODF / Framewrk / FWSemEvt / Sources / FWScpCol.cpp < prev    next >
Encoding:
Text File  |  1996-08-16  |  10.7 KB  |  347 lines  |  [TEXT/MPS ]

  1. //========================================================================================
  2. //
  3. //    File:                FWSemCol.cpp
  4. //    Release Version:    $ ODF 1 $
  5. //
  6. //    Copyright:            (c) 1993 - 1996 by Apple Computer, Inc., all rights reserved.
  7. //
  8. //========================================================================================
  9.  
  10. #ifndef FWSCPCOL_H
  11. #include "FWScpCol.h"
  12. #endif
  13.  
  14. #ifndef FWAPLEVT_H
  15. #include "FWAplEvt.h"
  16. #endif
  17.  
  18. #ifndef FWDSCOPR_H
  19. #include "FWDscOpr.h"
  20. #endif
  21.  
  22. //========================================================================================
  23. //    Runtime Information
  24. //========================================================================================
  25.  
  26. #ifdef FW_BUILD_MAC    
  27. #pragma segment fwsemevt
  28. #endif
  29.  
  30. FW_DEFINE_AUTO(FW_CScriptableCollection)
  31.  
  32. //========================================================================================
  33. // CLASS FW_CScriptableCollection
  34. //========================================================================================
  35.  
  36. FW_DEFINE_CLASS_M1(FW_CScriptableCollection, FW_MScriptable)
  37.  
  38. //---------------------------------------------------------------------------------------
  39. //    FW_CScriptableCollection::FW_CScriptableCollection
  40. //---------------------------------------------------------------------------------------
  41.  
  42. FW_CScriptableCollection::FW_CScriptableCollection() :
  43.     fRefCount(1),
  44.     fRep(FW_NEW(FW_TOrderedCollection<FW_MScriptable>, ()))
  45. {
  46.     FW_END_CONSTRUCTOR
  47. }
  48.  
  49. //---------------------------------------------------------------------------------------
  50. //    FW_CScriptableCollection::~FW_CScriptableCollection
  51. //---------------------------------------------------------------------------------------
  52.  
  53. FW_CScriptableCollection::~FW_CScriptableCollection()
  54. {
  55.     FW_START_DESTRUCTOR
  56.     
  57.     FW_ASSERT(fRefCount == 0);
  58.     
  59.     FW_MScriptable* element = fRep->First();
  60.  
  61.     while (element)
  62.     {
  63.         Remove(element);
  64.         element = fRep->First();
  65.     }
  66.     delete fRep;
  67. }
  68.  
  69. //---------------------------------------------------------------------------------------
  70. //    FW_CScriptableCollection::AcquireScriptable
  71. //---------------------------------------------------------------------------------------
  72.  
  73. long FW_CScriptableCollection::AcquireScriptable()
  74. {
  75.     return ++fRefCount;
  76. }
  77.  
  78. //---------------------------------------------------------------------------------------
  79. //    FW_CScriptableCollection::ReleaseScriptable
  80. //---------------------------------------------------------------------------------------
  81.  
  82. long FW_CScriptableCollection::ReleaseScriptable()
  83. {
  84.     FW_ASSERT(fRefCount > 0);
  85.     
  86.     long result = --fRefCount;
  87.     
  88.     if (result == 0)
  89.         delete this;
  90.     
  91.     return result;
  92. }
  93.  
  94. //---------------------------------------------------------------------------------------
  95. //    FW_CScriptableCollection::Add
  96. //---------------------------------------------------------------------------------------
  97.  
  98. void FW_CScriptableCollection::Add(FW_MScriptable* element)
  99. {
  100.     fRep->AddLast(element);
  101.     element->AcquireScriptable();
  102.     element->AddDependent(this);
  103. }
  104.  
  105. //---------------------------------------------------------------------------------------
  106. //    FW_CScriptableCollection::Remove
  107. //---------------------------------------------------------------------------------------
  108.  
  109. void FW_CScriptableCollection::Remove(FW_MScriptable* element)
  110. {
  111.     fRep->Remove(element);
  112.     element->RemoveDependent(this);
  113.     element->ReleaseScriptable();
  114. }
  115.  
  116. //---------------------------------------------------------------------------------------
  117. //    FW_CScriptableCollection::AdjustMarks
  118. //---------------------------------------------------------------------------------------
  119.  
  120. void FW_CScriptableCollection::AdjustMarks(Environment* ev,
  121.                                         ODSLong newStart,
  122.                                         ODSLong newStop)
  123. {
  124. FW_UNUSED(ev);
  125.     long elementsToDelete = Count() - newStop;
  126.     while (elementsToDelete > 0)
  127.     {
  128.         Remove(fRep->Last());
  129.         --elementsToDelete;
  130.     }
  131.     
  132.     elementsToDelete = newStart - 1;
  133.     while (elementsToDelete > 0)
  134.     {
  135.         Remove(fRep->First());
  136.         --elementsToDelete;
  137.     }
  138. }
  139.  
  140. //---------------------------------------------------------------------------------------
  141. //    FW_CScriptableCollection::GetTokenType
  142. //---------------------------------------------------------------------------------------
  143.  
  144. ODDescType FW_CScriptableCollection::GetTokenType() const
  145. {
  146.     return typeODFSemObjCollection;
  147. }
  148.  
  149. //---------------------------------------------------------------------------------------
  150. //    FW_CScriptableCollection::GetFrame
  151. //---------------------------------------------------------------------------------------
  152.  
  153. FW_CFrame* FW_CScriptableCollection::GetFrame(Environment* ev,
  154.                                             FW_CPart* part) const
  155. {
  156.     FW_MScriptable* first = NULL;
  157.  
  158.     if (Count() > 0)
  159.         first = fRep->First();
  160.     
  161.     return first ? first->GetFrame(ev, part) : FW_MScriptable::GetFrame(ev, part);
  162. }
  163.  
  164. //---------------------------------------------------------------------------------------
  165. //    FW_CScriptableCollection::DoAECountElements
  166. //---------------------------------------------------------------------------------------
  167.  
  168. void FW_CScriptableCollection::DoAECountElements(Environment* ev,    
  169.                                                     FW_CPart* part,
  170.                                                     const FW_CAppleEvent& event,
  171.                                                     FW_CAppleEvent& reply)
  172. {
  173. FW_UNUSED(ev);
  174. FW_UNUSED(part);
  175. FW_UNUSED(event);
  176.     reply.PutLongInteger(Count(), keyAEResult);
  177. }
  178.  
  179. //---------------------------------------------------------------------------------------
  180. //    FW_CScriptableCollection::DoAEGetData
  181. //---------------------------------------------------------------------------------------
  182.  
  183. void FW_CScriptableCollection::DoAEGetData(Environment* ev,    
  184.                                                 FW_CPart* part,
  185.                                                 const FW_CAppleEvent& event,
  186.                                                 FW_CAppleEvent& reply)
  187. {
  188.     FW_TOrderedCollectionIterator<FW_MScriptable> iter(fRep);
  189.     
  190.     FW_CAppleEvent     localEvent;
  191.     FW_CDesc        localDesc;
  192.     FW_CDesc        replyList;
  193.     
  194.     for (FW_MScriptable* semObj = iter.First(); iter.IsNotComplete(); semObj = iter.Next())
  195.     {
  196.         localEvent.Clear();
  197.         semObj->DoAEGetData(ev, part, event, localEvent);
  198.         
  199.         localDesc.Clear();
  200.         localEvent.GetDataByDesc(localDesc, keyAEResult);
  201.         
  202.         replyList.PutDataByDesc(localDesc);
  203.     }
  204.     
  205.     reply.PutDataByDesc(replyList, keyAEResult);
  206. }
  207.  
  208. //---------------------------------------------------------------------------------------
  209. //    FW_CScriptableCollection::DoAESetData
  210. //---------------------------------------------------------------------------------------
  211.  
  212. void FW_CScriptableCollection::DoAESetData(Environment* ev,    
  213.                                                 FW_CPart* part,
  214.                                                 const FW_CAppleEvent& event,
  215.                                                 FW_CAppleEvent& reply)
  216. {
  217.     FW_TOrderedCollectionIterator<FW_MScriptable> iter(fRep);
  218.     
  219.     for (FW_MScriptable* semObj = iter.First(); iter.IsNotComplete(); semObj = iter.Next())
  220.     {
  221.         semObj->DoAESetData(ev, part, event, reply);
  222.     }
  223. }
  224.  
  225. //---------------------------------------------------------------------------------------
  226. //    FW_CScriptableCollection::HasProperty
  227. //---------------------------------------------------------------------------------------
  228.  
  229. FW_Boolean FW_CScriptableCollection::HasProperty(ODDescType whichProperty) const
  230. {
  231.     FW_MScriptable* first = NULL;
  232.  
  233.     if (Count() > 0)
  234.         first = fRep->First();
  235.     
  236.     return first ? first->HasProperty(whichProperty) : FW_MScriptable::HasProperty(whichProperty);
  237. }
  238.  
  239. //---------------------------------------------------------------------------------------
  240. //    FW_CScriptableCollection::GetPropertyInfo
  241. //---------------------------------------------------------------------------------------
  242.  
  243. void FW_CScriptableCollection::GetPropertyInfo(Environment* ev,    
  244.                                                         FW_CPart* part,
  245.                                                         FW_Boolean& canUndo,
  246.                                                         FW_Boolean& causesChange) const
  247. {
  248.     FW_MScriptable::GetPropertyInfo(ev, part, canUndo, causesChange);
  249.     
  250.     if (Count() > 0)
  251.     {
  252.         FW_MScriptable* first = fRep->First();
  253.         if (first)
  254.             first->GetPropertyInfo(ev, part, canUndo, causesChange);
  255.     }
  256. }
  257.  
  258. //---------------------------------------------------------------------------------------
  259. //    FW_CScriptableCollection::GetProperty
  260. //---------------------------------------------------------------------------------------
  261.  
  262. FW_Boolean FW_CScriptableCollection::GetProperty(Environment* ev, 
  263.                                                     FW_CPart* part,
  264.                                                     FW_CDesc& propertyValue, 
  265.                                                     ODDescType whichProperty,
  266.                                                     ODDescType desiredType) const
  267. {
  268.     FW_TOrderedCollectionIterator<FW_MScriptable> iter(fRep);
  269.     FW_CDesc eachProperty;
  270.  
  271.     for (FW_MScriptable* semObj = iter.First(); iter.IsNotComplete(); semObj = iter.Next())
  272.     {
  273.         eachProperty.Clear();
  274.         semObj->GetProperty(ev, part, eachProperty, whichProperty, desiredType);
  275.         
  276.         propertyValue << eachProperty;
  277.     }
  278.     return TRUE;
  279. }
  280.  
  281. //---------------------------------------------------------------------------------------
  282. //    FW_CScriptableCollection::SetProperty
  283. //---------------------------------------------------------------------------------------
  284.  
  285. void FW_CScriptableCollection::SetProperty(Environment* ev, 
  286.                                             FW_CPart* part,
  287.                                             FW_CDesc& propertyValue, 
  288.                                             ODDescType whichProperty)
  289. {
  290.     FW_TOrderedCollectionIterator<FW_MScriptable> iter(fRep);
  291.         
  292.     for (FW_MScriptable* semObj = iter.First(); iter.IsNotComplete(); semObj = iter.Next())
  293.     {
  294.         semObj->SetProperty(ev, part, propertyValue, whichProperty);
  295.     }
  296. }
  297.  
  298. //---------------------------------------------------------------------------------------
  299. //    FW_CScriptableCollection::RestoreProperty
  300. //---------------------------------------------------------------------------------------
  301.  
  302. void FW_CScriptableCollection::RestoreProperty(Environment* ev,
  303.                                                 FW_CPart* part,
  304.                                                 FW_CDesc& propertyValue,
  305.                                                 ODDescType whichProperty)
  306. {
  307.     FW_TOrderedCollectionIterator<FW_MScriptable> iter(fRep);
  308.     FW_CDesc eachProperty;
  309.     long index = 1;
  310.         
  311.     for (FW_MScriptable* semObj = iter.First(); iter.IsNotComplete(); semObj = iter.Next())
  312.     {
  313.         eachProperty.Clear();
  314.         propertyValue.GetDescFromList(index++, eachProperty);
  315.         semObj->SetProperty(ev, part, eachProperty, whichProperty);
  316.     }
  317. }
  318.  
  319. //---------------------------------------------------------------------------------------
  320. //    FW_CScriptableCollection::GetUndoStrings
  321. //---------------------------------------------------------------------------------------
  322.  
  323. void FW_CScriptableCollection::GetUndoStrings(Environment* ev,
  324.                                                 FW_CPart* part,
  325.                                                 ODDescType whichProperty,
  326.                                                 FW_CString& undoString,
  327.                                                 FW_CString& redoString) const
  328. {
  329.     FW_MScriptable* first = NULL;
  330.     
  331.     if (Count() > 0)
  332.         first = fRep->First();
  333.     
  334.     if (first)
  335.         first->GetUndoStrings(ev, part, whichProperty, undoString, redoString);
  336.     else
  337.         FW_MScriptable::GetUndoStrings(ev, part, whichProperty, undoString, redoString);
  338. }
  339.  
  340. //---------------------------------------------------------------------------------------
  341. //    FW_CScriptableCollection::HandlePrimaryDeleted
  342. //---------------------------------------------------------------------------------------
  343.  
  344. void FW_CScriptableCollection::HandlePrimaryDeleted(FW_MScriptable* primary)
  345. {
  346.     fRep->Remove(primary);
  347. }